package com.zsj.heap;

/**
 * @author zsj
 * @version 1.0
 * @date 2024/6/13 11:43
 * @description
 */
public class HeapDemo {
    public static void main(String[] args) {
        /*
        java中的对象 是存在堆中的
        而存在堆中的对象分为两类
            一种是生命周期较短的瞬时对象,这些对象的创建和死亡都十分迅速
            另一类的生命周期比较长，在某些极端的情况下甚至能和Jvm的生命周期保持一致
        jvm的堆区进一步划分的话 可以划分为新生代youngGen和老年代olgGen
        其中新生代又可以划分为eden空间和survivor0和survivor1空间
        有时也叫做 form区 和 to区

        每次gc都会重eden区回收对象
        如果经过16次 对象都没有被回收
        它将会进入survivor空间 然后在下一次会进入老年代

        一般情况 新生代会占堆的三分之一的空间
                老年代会占堆的三分之二的空间
         我们可以在运行项目时指定 堆的占比空间
          -XX:NewRatio=2, 表示新生代占1 老年代占2,新生代占整个堆的1/3
          -XX:NewRatio=4，标识新生代占1 老年代占4 新生代占整个堆的1/5

          -XX:SurvivorRatio=8,表示新生代中Eden区与survivor0区占比为8:1:1
          -XX:-UseAdaptiveSizePolicy,表示不使用自适应大小策略 -号去掉就是使用

        -xms  初始化堆大小  默认单位为字节
        -xmx  最大堆内存大小  默认单位为字节
        推荐将两个设置为一样的 因为堆内存大小设置过大会导致内存溢出


        -Xmn 设置新生代内存大小

         */
        System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);
        System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);
        System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);
    }
}
